package com.smday.sort;

import java.util.Arrays;

/**
 * @author Summerday
 */
public class InsertSort {


    public static void main(String[] args) {

        int[] arr = {101, 34, 119, 1};
        insertSortV(arr);
    }


    public static void insertSortV(int[] arr) {
        int insertVal;
        int insertIndex;
        for (int i = 1; i <= arr.length - 1; i++) {

            insertVal = arr[i];

            //arr[1]前面的一个数的下标
            insertIndex = i - 1;

            //给insertVal找到插入的数据

            //insertIndex>=0保证再给insertVal找插入位置时不越界
            //insertVal<arr[insertIndex] 待插入的数还没有找到插入位置
            //此时将arr[insertIndex]后移

            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {

                arr[insertIndex + 1] = arr[insertIndex];

                insertIndex--;
            }
            //退出while循环时说明插入的位置找到,insertIndex+1
            if (insertIndex + 1 != i) {
                arr[++insertIndex] = insertVal;
            }


            System.out.printf("第%d轮后: %s\n", i, Arrays.toString(arr));

        }


    }

    //插入排序逐步推导
    public static void insertSort(int[] arr) {


        //定义待插入的数

        //第一轮  101 34 119 1 --> 34 101 119 1

        int insertVal = arr[1];

        //arr[1]前面的一个数的下标
        int insertIndex = 1 - 1;

        //给insertVal找到插入的数据

        //insertIndex>=0保证再给insertVal找插入位置时不越界
        //insertVal<arr[insertIndex] 待插入的数还没有找到插入位置
        //此时将arr[insertIndex]后移

        while (insertIndex >= 0 && insertVal < arr[insertIndex]) {

            arr[insertIndex + 1] = arr[insertIndex];

            insertIndex--;
        }
        //退出while循环时说明插入的位置找到,insertIndex+1
        arr[++insertIndex] = insertVal;

        System.out.printf("第一轮后: %s\n", Arrays.toString(arr));

        //第二轮  101 34 119 1 --> 34 101 119 1

        insertVal = arr[2];

        //arr[1]前面的一个数的下标
        insertIndex = 2 - 1;

        //给insertVal找到插入的数据

        //insertIndex>=0保证再给insertVal找插入位置时不越界
        //insertVal<arr[insertIndex] 待插入的数还没有找到插入位置
        //此时将arr[insertIndex]后移

        while (insertIndex >= 0 && insertVal < arr[insertIndex]) {

            arr[insertIndex + 1] = arr[insertIndex];

            insertIndex--;
        }
        //退出while循环时说明插入的位置找到,insertIndex+1
        arr[++insertIndex] = insertVal;

        System.out.printf("第二轮后: %s\n", Arrays.toString(arr));


        //第三轮  34 101 119 1 --> 1, 34, 101, 119

        insertVal = arr[3];

        //arr[1]前面的一个数的下标
        insertIndex = 3 - 1;

        //给insertVal找到插入的数据

        //insertIndex>=0保证再给insertVal找插入位置时不越界
        //insertVal<arr[insertIndex] 待插入的数还没有找到插入位置
        //此时将arr[insertIndex]后移

        while (insertIndex >= 0 && insertVal < arr[insertIndex]) {

            arr[insertIndex + 1] = arr[insertIndex];

            insertIndex--;
        }
        //退出while循环时说明插入的位置找到,insertIndex+1
        arr[++insertIndex] = insertVal;

        System.out.printf("第三轮后: %s\n", Arrays.toString(arr));

    }
}



